package com.meidaia.java.main;

import com.meidaia.java.main.pojo.AIAssistant;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class AIManager {
    private AIAssistants aiAssistants;
    private final Scanner sc = new Scanner(System.in);
    private final boolean START_STATUS = true;
    private final boolean STOP_STATUS = false;

    public void run() {
        aiAssistants = new AIAssistants();
        while (true) {
            printMenu();
            int choose = readChoose("请选择操作: ", 0, 9);
            switch (choose) {
                case 1: // 列表展示
                    list();
                    break;
                case 2: // 通过id查询
                    selectById();
                    break;
                case 3: // 添加AI助手
                    insert();
                    break;
                case 4: // 修改数据
                    update();
                    break;
                case 5: // 通过id删除数据
                    deleteById();
                    break;
                case 6: // 修改状态
                    startOrStop(START_STATUS);
                    break;
                case 7: // 修改状态
                    startOrStop(STOP_STATUS);
                    break;
                case 8: // 分配任务
                    assignTasks();
                    break;
                case 9: // 信息统计
                    statistics();
                    break;
                case 0: // 退出系统
                    exitManager();
                    break;
                default:
                    managerErr();
                    break;
            }
        }
    }

    /**
     * 信息统计
     */
    private void statistics() {
        StringBuilder builder = new StringBuilder();
        builder.append("系统统计信息: ").append(System.lineSeparator());
        AIAssistant[] all = aiAssistants.getAll();
        int onlineCnt = 0, offlineCnt = 0, score = 0;
        for(AIAssistant aiAssistant : all){
            onlineCnt += aiAssistant.getStatus() ? 1 : 0;
            offlineCnt += aiAssistant.getStatus() ? 0 : 1;
            score += aiAssistant.getScore();
        }
        builder.append("总助手数: " + all.length).append(System.lineSeparator());
        builder.append("在线助手数: " + onlineCnt).append(System.lineSeparator());
        builder.append("离线助手数: " + offlineCnt).append(System.lineSeparator());
        builder.append("平均能力评分: " + (all.length == 0 ? 0D : (double)score / all.length))
                .append(System.lineSeparator());

        showMessage(builder.toString());
    }

    /**
     * 分配任务
     */
    private void assignTasks() {
        int choose = readChoose("请输入目标AI助手ID: ");
        AIAssistant aiAssistant = aiAssistants.selectById(choose);
        if(aiAssistant == null){
            showMessage("❌ 助手不存在");
            return;
        }
        if(aiAssistant.getStatus() == STOP_STATUS){
            showMessage("❌ " + aiAssistant.getName() + " 当前离线，无法执行任务。");
            return;
        }
        System.out.print("请输入任务内容: ");
        while(true){
            String task = sc.nextLine().trim();
            if("".equals(task)){
                System.out.print("⚠ 输入的内容为空，请重新输入内容: ");
            }else{
                showMessage("【 " + aiAssistant.getName() + " 】执行任务: " + task);
                break;
            }
        }
    }

    /**
     * 修改状态
     */
    private void startOrStop(boolean status) {
        int choose;
        String statusTip = status == START_STATUS ? "启动" : "停止";
        String msg = "请输入要" + statusTip + "的AI助手ID: ";
        choose = readChoose(msg);

        AIAssistant aiAssistant = aiAssistants.selectById(choose);
        if (aiAssistant == null){
            showMessage("助手不存在");
            return;
        }

        aiAssistant.setStatus(status);
        aiAssistants.update(aiAssistant);
        showMessage("✅ 助手【" + aiAssistant.getName() + "】已" + statusTip + "。");
    }

    /**
     * 修改数据
     */
    private void update() {
        int choose = readChoose("请输入ID: ");

        AIAssistant aiAssistant = aiAssistants.selectById(choose);
        if(aiAssistant == null){
            showMessage("❌ 根据ID, 找不到助手:(");
            return;
        }

        /*可修改属性列表为：name,type,version,online,score
          请输入要要修改的属性和值，用空格分割: */
        System.out.println("可修改属性列表为：name,type,version,online,score");
        System.out.print("请输入要要修改的属性和值，用空格分割: ");

        Set<String> options = new HashSet<>(Arrays.asList("name", "type", "version", "online", "score"));

        String[] s;
        while (true) {
            String input = sc.nextLine().trim();
            s = input.split(" ");
            if(s.length != 2 || !options.contains(s[0])){
                System.out.print("⚠ 输入的格式出错，请重新输入: ");
            }else{
                try {
                    switch (s[0]){
                        case "name":
                            aiAssistant.setName(s[1]);
                            break;
                        case "type":
                            aiAssistant.setType(s[1]);
                            break;
                        case "version":
                            aiAssistant.setVersion(Double.parseDouble(s[1]));
                            break;
                        case "online":
                            int status = Integer.parseInt(s[1]);
                            if(status != 1 && status != 0){
                                throw new NumberFormatException();
                            }
                            aiAssistant.setStatus(status == 1);
                            break;
                        case "score":
                            aiAssistant.setScore(Integer.parseInt(s[1]));
                            break;
                        default:
                            managerErr();
                            break;
                    }
                    break;
                } catch (NumberFormatException e) {
                    System.out.print("⚠ 更新失败，请输入正确的数据格式: ");
                }
            }
        }
        boolean update = aiAssistants.update(aiAssistant);
        if(update) {
            showMessage("✅ 助手【" + aiAssistant.getName() + "】修改成功！");
        }else{
            managerErr();
        }
    }

    /**
     * 通过id删除数据
     */
    private void deleteById() {
        int choose = readChoose("请输入要删除的AI助手ID: ");
        String ret = aiAssistants.deleteById(choose);
        showMessage(ret);
    }

    /**
     * 通过id查询
     */
    private void selectById() {
        int choose = readChoose("请输入要查询的AI助手ID: ");
        AIAssistant aiAssistant = aiAssistants.selectById(choose);
        if (aiAssistant == null) {
            showMessage("❌ 助手不存在");
        } else {
            showMessage("✅ 查询结果: " + aiAssistant.toString());
        }
    }

    /**
     * 获取到用户输入的数字
     *
     * @param tip 提示信息
     * @param minValue 选择的最小值
     * @param maxValue 选择的最大值
     * @return 选择数字
     */
    private int readChoose(String tip, int minValue, int maxValue) {
        while (true) {
            System.out.print(tip);
            String s = sc.nextLine().trim();
            int choose = -1;
            if (s.isEmpty()) {
                System.out.println("⚠ 输入不能为空！");
                continue;
            }
            try {
                choose = Integer.parseInt(s);
            } catch (NumberFormatException e) {
                System.out.println("⚠ 请输入正确的数字选项！");
                continue;
            }
            if (choose >= minValue && choose <= maxValue) {
                return choose;
            }
            System.out.println("⚠ 请输入正确的数字选项！");
        }
    }

    /**
     * readChoose 重载
     *
     * @param tip 提示信息
     * @return 选择数字
     */
    private int readChoose(String tip) {
        while (true) {
            System.out.print(tip);
            String s = sc.nextLine().trim();
            if (s.isEmpty()) {
                System.out.println("⚠ 输入不能为空！");
                continue;
            }
            try {
                return Integer.parseInt(s);
            } catch (NumberFormatException e) {
                System.out.println("⚠ 请输入正确的数字选项！");
            }
        }
    }

    /**
     * 添加AI助手
     */
    private void insert() {
        /*
         * 添加新AI助手
         * 请输入ID: 106
         * 请输入名称: DeepSeek
         * 请输入版本号: 3.1
         * 是否在线？(1-是, 0-否): 1
         * 请输入能力评分(0-100): 98
         */
        AIAssistant aiAssistant;
        try {
            aiAssistant = new AIAssistant();
            System.out.println("添加新AI助手");
            System.out.print("请输入ID: ");
            aiAssistant.setId(Integer.parseInt(sc.nextLine()));
            System.out.print("请输入名称: ");
            aiAssistant.setName(sc.nextLine());
            System.out.print("请输入类型: ");
            aiAssistant.setType(sc.nextLine());
            System.out.print("请输入版本号: ");
            aiAssistant.setVersion(Double.parseDouble(sc.nextLine()));
            System.out.print("是否在线？(1-是, 0-否): ");
            int i = Integer.parseInt(sc.nextLine());
            if(i != 0 && i != 1){
                throw new NumberFormatException();
            }
            aiAssistant.setStatus(i == 1);
            System.out.print("请输入能力评分(0-100): ");
            aiAssistant.setScore(Integer.parseInt(sc.nextLine()));
        } catch (NumberFormatException e) {
            showMessage("输入非法，退出...");
            return;
        }

        String ret = aiAssistants.add(aiAssistant);
        showMessage(ret);
    }

    /**
     * 退出系统
     */
    private void exitManager() {
        System.out.println("正在退出系统，期待与你的再次相见:)");
        System.exit(0);
    }

    /**
     * 系统错误
     */
    private void managerErr() {
        System.out.println("系统出错，请联系管理员:(");
    }

    /**
     * 列表展示
     */
    private void list() {
        System.out.println("所有AI助手列表: ");
        showMessage(aiAssistants.toString());
    }

    /**
     * 展示信息，回车继续
     *
     * @param message 信息
     */
    private void showMessage(String message) {
        System.out.print(message);
        //如果结尾没有换行符，换行
        if(!message.endsWith(System.lineSeparator())){
            System.out.print(System.lineSeparator());
        }
        System.out.print("(回车继续...)");
        sc.nextLine();
    }

    /**
     * 打印菜单
     */
    private void printMenu() {
        System.out.println("========== \uD83E\uDD16AI助手管理器 ==========");
        System.out.println("1. 查看所有AI助手列表");
        System.out.println("2. 根据ID查询助手详情");
        System.out.println("3. 添加新的AI助手");
        System.out.println("4. 根据ID修改助手信息");
        System.out.println("5. 删除AI助手（按ID）");
        System.out.println("6. 启动AI助手服务");
        System.out.println("7. 停止AI助手服务");
        System.out.println("8. 为AI助手分配任务");
        System.out.println("9. 显示系统统计信息");
        System.out.println("0. 退出系统");
        System.out.println("===================================");
    }
}
